/*
 * Repraesentiert eine Liste von Staaten 
 */
public class World {
	
	//Anfang der Liste
	private element head;
	
	//Ende der Liste
	private element tail;
	
	//Anzahl aller erzeugten elemente
	private int n;
	
	/*Beim erzeugen einer neuen Liste 
	head = null
	Anzahl der Elemente = 0*/
	
	public World()
	{
		this.head = null;
		this.tail = null;
		this.n = 0;
	}
	public class element
	{
		//Represent the value of element
		private Staat valueelem; 
		
		//Represent next element
		private element nextelem;
		
		//Create the element,set next element = null
		//IN: Person
		public element (Staat elem) 
		{ 
			this.valueelem = elem; 
			this.nextelem = null;
		}
		
		//---Getter---
		// get next element
		// Out: element of List
		protected element getnext()
		{
			return this.nextelem;
		}
		//get Value of element
		// Out: Person
		protected Staat getvalue()
		{
			return this.valueelem;
			
		}		
		//---Setter:
		//set next element
		// IN: element
		public void setnext(element a)
		{
			this.nextelem = a;
		}
		//set Value of element
		// IN: Person
		public void setvalue(Staat a)
		{
			this.valueelem = a;
		}		
	}
	//Check if Vorn + Nachn exists in List
	protected boolean checkdouble(String name)
	{
		iterator temp_iterator = new iterator();
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getname().equals(name))
				return false;
			
			temp_iterator.next();	
		}
		return true;
	}
	//Einfuegen eines neuen Elements am Ende der Liste
	//IN: Staat
	//Out: boolean (add or add not)
	public boolean add(Staat newelem)
	{
		if(!checkdouble(newelem.getname()))
				return false;
		//Anzahl erhoehen
		this.n++;
		
		if (head == null)
			tail = head = new element(newelem);
		else 
		{
			element neu = new element(newelem);
			tail.setnext(neu);
			tail = neu; 
		}
		return true;
	}
	//delete elements from List
	public boolean remove(String name)
	{
		iterator temp_iterator = new iterator();
		iterator pre = null;
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getname().equals(name))
			{
				pre.pointer.setnext(temp_iterator.pointer.getnext());
				return false;
			}
			pre = temp_iterator;
			temp_iterator.next();
		}
		return true;
	}
	//Suchen nach Personen in einem Staat ueber deren Namen 
	//IN:String ,String
	//Out: boolean (gefunden)
	public boolean searchstaat(String name)
	{
		iterator temp_iterator = new iterator();
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getname().equals(name))
				return true; //gefunden
			temp_iterator.next();
		}
		return false;
	}
	//Rep. Pointer auf Elemente der Liste
	//Intit auf Head
	protected class iterator
	{
		private element pointer;
		
		//Pointer auf erstes Element in der Liste setzen
		iterator()
		{
			pointer = head;
		}
		
		//Gibt das naechste Element zurueck und verschiebt Pointer auf dieses
		//Out: aktuelles element Person ||null wenn liste leer
		public Staat next() 
		{
			if(pointer == null)
				return null;
			else
			{
				Staat elem = pointer.getvalue();
				pointer = pointer.getnext();
				return elem;
			}
			
		}
		//Gibt zurueck ob ein naechstes Element exestiert
		//Out: boolean
		public boolean hasNext() 
		{
			return pointer != null;
			
		}
		
	}
	//Erzeugt einen iterator der Liste
	//Out: class iterator();
	public iterator iterator() 
	{
		return new iterator();
	}
	//einfuegen einer Person zu Staat a
	//IN: String Staatname, Person einzufeugende Person
	public boolean insertPerson(String name,Person p)
	{
		iterator temp_iterator = new iterator();
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getname().equals(name))
				if(temp_iterator.pointer.getvalue().add(p))
					return true;
			temp_iterator.next();
		}
		return false;
	}
	//loeschen wenn Staat gewusst
	//IN: String Staatname,String Vorname, String NAchname
	//Out: Boolean(geloscht --> true)
	public boolean deletePerson(String name,String Vorn,String Nachn)
	{
		iterator temp_iterator = new iterator(); 
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getname().equals(name))
				if(temp_iterator.pointer.getvalue().remove(Vorn, Nachn))
					return true;
			temp_iterator.next();
		}
		return false;
	}
	public String toString()
	{
		String out="";
		iterator temp_iterator = new iterator(); 
		while(temp_iterator.hasNext())
		{
			out = out + temp_iterator.pointer.getvalue().getname()+":\n";
			out = out +temp_iterator.pointer.getvalue().toString();
			temp_iterator.next();
		}
		return out;
	}
	/*Statistische Methoden fuer alle Staaten*/
	
	//Akademikerquote aller Staaten
	public double akademikerquote(int type)
	{
		iterator temp_iterator = new iterator();
		double out = 0;
		
		while(temp_iterator.hasNext())
		{
			out = out + temp_iterator.pointer.getvalue().akademikerquote(type);
			temp_iterator.next();
		}
		if (n != 0)
			return out/(double)n;
		return 0;
	}
	
	//Durchschnittliche Studiendauer aller Staaten
	public double studiendauerDurchschnitt(int type)
	{
		iterator temp_iterator = new iterator();
		double out = 0;
		double sum =0;
		
		while(temp_iterator.hasNext())
		{
			out = out + temp_iterator.pointer.getvalue().studiendauerDurchschnitt(type);
			if(temp_iterator.pointer.getvalue().studiendauerDurchschnitt(type) != 0)
				sum++;
			temp_iterator.next();
		}
		if (sum != 0)
			return out/sum;
		return 0;
	}
	
	//Prozentsatz der Studienabbrecher fuer alle Staaten
	public double studienabbrecher(int type)
	{
		iterator temp_iterator = new iterator();
		double out = 0;
		
		while(temp_iterator.hasNext())
		{
			out = out + temp_iterator.pointer.getvalue().studienabbrecher(type);
			temp_iterator.next();
		}
		if (n != 0 && out != 0)
			return out/(double)n;
		return 0;
	}
}
